package org.zxp.thread.communication.observation;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * @program: zxp-thread-test
 * @description: 中间商 synchronized实现版本
 * @author: X-Pacific zhang
 * @create: 2019-05-18 15:58
 **/
public class Mid {
    static Queue<String> msgqueue = new ConcurrentLinkedQueue<>();
    /**
     * 最多库存10件
     */
    static final int MAX_QUEUE_NUM = 10;
    /**
     * 当前库存件数
     */
    static volatile int num = 0;


    /**
     * 生产者生产消息并提供给中间商
     * 当件数等于10件，则停止生产并通知消费者消费
     * 否则生产
     */
    public static synchronized void put(String msg) throws InterruptedException {
        if(num == 10){
            System.out.println("库存满，停止生产！开始消费");
            Mid.class.wait();//停止供货了
        }else{
            msgqueue.add(msg);
            num++;
        }
    }

    /**
     * 消费者消费消息
     *当件数等于   0件，则通知消费者停止消费，并通知生产者生产
     * 否则消费
     */
    public static synchronized void take() throws InterruptedException {
        if(num == 0){
            System.out.println("库存空，停止消费！开始生产");
            Mid.class.notifyAll();//开始生产
        }else{
            num--;
            System.out.println("["+num+"]"+msgqueue.poll()+"真香");
        }
    }
}
